<?php
/**
 * 文件系统操作类
 * @author chenhao
 * @copyright 成都四方客信息技术有限公司
 * @link http://www.sifangke.cn/
 * @since Fri Nov 20 13:27:55 CST 2009
 * @id cls_filesystem.php
 */
 
if (!defined('IN_SYS')) {
	die('No admittance');
}

class cls_filesystem {
	
	/**
	 * 读取指定文件内容
	 *
	 * @param string $file 所要取得的文件
	 * @return string 返回取得的内容
	 */
	public static function get_file_contents($file) {
		if (($f = @fopen($file,'rb')) === false) {
			return false;
		} else {
			$fsize = @filesize($file);
			if ($fsize) {
				$contents = fread($f, $fsize);
			}
			fclose($f);
			return $contents;
		}
	}
	/**
	 * 创建新文件，并写入内容，如果指定文件名已存在，那将直接覆盖
	 *
	 * @param string $file 新文件名
	 * @param string $source 文件内容
	 * @return bloo 如果成功则返回写入的字符数，否则返回false
	 */
	public static function writefile($file, $source) {
		if($fp = @fopen($file,'w')){
			$filesource = fwrite($fp,$source);
			fclose($fp);
			return $filesource;
		} else {
			return false;
		}
	}
	/**
	 * 移动文件
	 *
	 * @param source $file 待移动的文件名
	 * @param source $destfile 目标文件名
	 * @param bloo $overwrite 如果目标文件存在，是否覆盖.默认是覆盖.
	 * @param bloo $bak  是否保留原文件 默认是不保留即删除原文件
	 * @return bloo
	 */
	private static function movefile($file, $destfile, $overwrite=1, $bak=0) {
		if(file_exists($destfile)){
			if($overwrite) {
				unlink($destfile);
			} else {
				return false;
			}
		}
		if($cf=copy($file,$destfile)){
			if(!$bak)
			return(unlink($file));
		}
		return $cf;
	}
	/**
	 * 移动目录（文件夹）
	 * 
	 * @param source $dir 待移动的目录名
	 * @param source $destdir 目标目录名,如果目标目录不存在则创建目标目录
	 * @param bloo $overwrite 如果目标目录存在，是否覆盖.默认是覆盖.
	 * @param bloo $bak  是否保留原目录 默认是不保留即删除原目录
	 * @return bloo
	 */
	private static function movedir($dir, $destdir, $overwrite=1, $bak=0) {
		@set_time_limit(600);
		if(!file_exists($destdir)) {
			cls_filesystem::notfate_any_mkdir($destdir);
		}
		if(file_exists($dir)&&(is_dir($dir))) {
			if(substr($dir,-1)!='/')$dir.='/';
			if(file_exists($destdir)&&(is_dir($destdir))){
				if(substr($destdir,-1)!='/')$destdir.='/';
				$h=opendir($dir);
				while($file=readdir($h)){
					if($file=='.'||$file=='..')
					{
						continue;
						$file="";
					}
					if(is_dir($dir.$file)){
						if(!file_exists($destdir.$file))
						cls_filesystem::notfate_mkdir($destdir.$file);
						else
						chmod($destdir.$file,0777);
						cls_filesystem::movedir($dir.$file,$destdir.$file,$overwrite,$bak);
						cls_filesystem::delforder($dir.$file);
					}
					else
					{
						if(file_exists($destdir.$file)){
							if($overwrite)unlink($destdir.$file);
							else{
								continue;
								$file="";
							}
						}
						if(copy($dir.$file,$destdir.$file))
						if(!$bak)
						if(file_exists($dir.$file)&&is_file($dir.$file))
						@unlink($dir.$file);
					}
				}
			} else {
				return false;
			}
		} else {
			return false;
		}
	}
	/**
	 * 移动文件或目录
	 *
	 * @param source $file 源文件/目录
	 * @param string $path 目标路径
	 * @param bloo $overwrite 如是目标路径中已存在该文件时，是否覆盖移动;默认值是1, 即覆盖
	 * @param bloo $bak 是否保留备份(原文件/目录)
	 * @return bloo
	 */
	public static function move($file, $path, $overwrite=1, $bak=0) {
		if(file_exists($file)){
			if(is_dir($file)){
				if(substr($file,-1)=='/')$dirname=basename(substr($file,0,strlen($file)-1));
				else $dirname=basename($file);
				if(substr($path,-1)!='/')$path.='/';
				if($file!='.'||$file!='..'||$file!='../'||$file!='./')$path.=$dirname;
				cls_filesystem::movedir($file,$path,$overwrite,$bak);
				if(!$bak)cls_filesystem::delforder($file);
			}
			else{
				if(file_exists($path)){
					if(is_dir($path))chmod($path,0777);
					else {
						if($overwrite)
						@unlink($path);
						else
						return false;
					}
				}
				else
				cls_filesystem::notfate_any_mkdir($path);
				if(substr($path,-1)!='/')$path.='/';
				cls_filesystem::movefile($file,$path.basename($file),$overwrite,$bak);
			}
		}
		else
		return false;
	}
	/**
	 * 删除指定目录下的全部文件
	 *
	 * @param  $dir 目录
	 */
	public static function clear_dir_file($dir) {
		$directory = dir($dir);
		while($entry = $directory->read()) {
			$filename = $dir.'/'.$entry;
			if(is_file($filename)) {
				@unlink($filename);
			}
		}
		$directory->close();
		return true;
	}
	/**
	 * 删除目录,不管该目录下是否有文件或子目录，全部删除哦，小心别删错了哦!
	 *
	 * @param source $file
	 * @return file
	 */
	public static function delforder($file) {
		chmod($file,0777);
		if (is_dir($file)) {
			$handle = opendir($file);
			while($filename = readdir($handle)) {
				if ($filename != "." && $filename != "..")
				{
					cls_filesystem::delforder($file."/".$filename);
				}
			}
			closedir($handle);
			return(rmdir($file));
		}
		else {
			unlink($file);
		}
	}
	/**
	 * 创建新目录,弥补mkdir的不足.
	 *
	 * @param string $dir 目录名
	 * @return bloo
	 */
	public static function notfate_mkdir($dir,$mode=0777) {
		$u=umask(0);
		$r=mkdir($dir,$mode);
		umask($u);
		return $r;
	}
	/**
	 * 创建多级目录
	 *
	 * @param string $dirs --目录名
	 * @return bloo
	 */
	public static function notfate_any_mkdir($dirs,$mode=0777) {
		if(!strrpos($dirs,'/'))
		{
			return(cls_filesystem::notfate_mkdir($dirs,$mode));
		} else {
			$forder=explode('/',$dirs);
			$f='';
			for($n=0;$n<count($forder);$n++)
			{
				if($forder[$n]=='') continue;
				$f.=((($n==0)&&($forder[$n]<>''))?(''):('/')).$forder[$n];
				if(file_exists($f)){
					chmod($f,0777);
					continue;
				}
				else
				{
					if(cls_filesystem::notfate_mkdir($f,$mode)) continue;
					else
					return false;
				}
			}
			return true;
		}
	}
	
	//THE END
}